#include "../libreria.h"
#include "../response_rotate_image.h"
#include <signal.h>
int s;
void deregistra(int sig_receive)
{
	close(s);
}


int main(int argc, char * argv[])
{
	char msg [BUFFER_SIZE];
	char lunghezza_file [BUFFER_SIZE];
	char nome_servizio [BUFFER_SIZE];
	char ip_service_register [BUFFER_SIZE];
	char nome_immagine [BUFFER_SIZE];
	char direzione [BUFFER_SIZE];
	char nome_immagine_con_nuovo_path [BUFFER_SIZE];
	int porta_service_register;
	int i;
	
	int r;
	int len_file;

	host service_provider;

	signal(SIGINT,deregistra);

	i = 0;
	if (argc != 6)
	{
		printf("Errore numero parametri:\nUsage: ./client_rotate_image ip_service_register porta_service_register nome_servizio nome_immagine.jpg direzione_di_rotazione(sx,dx)\n");
		exit(1);
	}

	strcpy( ip_service_register, argv[1] );
	porta_service_register = atoi(argv[2]);
	strcpy( nome_servizio, argv[3] );
	strcpy( nome_immagine, argv[4] );
	strcpy( direzione, argv[5] );

	if (!(strcmp( "sx", direzione ) == 0) && !(strcmp( "dx", direzione ) == 0))
	{	
		printf("Errore, inserire come ultimo parametro da riga di comando:\nsx: per ruotare a sinistra\ndx: per ruotare a destra\n"); 
		exit(1);
	}

	/////////// INIZIALIZZAZIONE SOCKET PER CONNESSIONE SERVICE REGISTER /////////////

	s = inizializza_client( ip_service_register, porta_service_register );
	
	////////// INVIO MESSAGGI PER CONTATTARE SERVICE REGISTER //////////////
	
	sprintf( msg, "2;%s#", nome_servizio );
	if (send( s, msg, strlen(msg), 0 ) == -1)
	{
		printf("Errore nell'invio del messaggio per contattare il Service Register\n");
		exit(1);
	}

	/////////// RICEZIONE RISPOSTA DA SERVICE REGISTER ////////////////////
	
	memset( msg, 0, BUFFER_SIZE );

	r = recv ( s, msg, BUFFER_SIZE, 0 );
	if (r == -1)
	{
		printf("Errore ricezione risposta dal Service Register\n");
		exit(1);
	}
	if (msg[0] == '0')
	{ 
		printf("Errore, il servizio richiesto non è disponibile\n");
		exit(1);
	}
	
	decode_msg_from_service_register( msg, service_provider.ip, &service_provider.porta );
	
	close(s);
	
	//////////  CHIUSURA CONNESSIONE SERVICE REGISTER  ///////////////


	////////// INIZIALIZZAZIONE CONNESSIONE SERVICE PROVIDER ///////////////

	service_provider.s = inizializza_client( service_provider.ip, service_provider.porta );	

	printf("CONNESSO con il Service Provider %s:%d\n",service_provider.ip,service_provider.porta);

	////////// INVIO IMMAGINE DA RUOTARE AL SERVICE PROVIDER ///////////////

	memset( msg, 0, BUFFER_SIZE );

	Response_Rotate_Image rri(service_provider);
	
	if (!rri.code_request( nome_immagine, direzione ))
	{		
		printf("Errore nella comunicazione col service provider.\nControllare i parametri da riga di comando\n");
		exit(1);
	}

	if (!rri.send_image(nome_immagine))
	{
		printf("Errore nell'invio dell'immagine da ruotare al service provider\n");
		exit(1);
	}

	////////// RICEZIONE IMMAGINE RUOTATA DAL SERVICE PROVIDER ///////////////

	if (!rri.decode_response(lunghezza_file)) // ricezione della dimensione dell'immagine ruotata
	{	
		printf("Errore sul Service Provider durante la rotazione dell'immagine\n");
		exit(1);
	}
	
	len_file=atoi(lunghezza_file);

	if (len_file <= 0)
	{
		printf("Errore: impossibile ricevere immagine specchiata dal service provider\n");
		exit(1);
	}

	
	i = 0;

	
	memset( nome_immagine_con_nuovo_path, 0, BUFFER_SIZE );
	memset( msg, 0, BUFFER_SIZE);
	strcpy( msg, nome_immagine );

	while (msg[i++]!='/');
	
	sprintf( nome_immagine_con_nuovo_path, "foto_temp/%s", &msg[i]);

	//ricezione immagine specchiata
	if(!rri.receive_image( nome_immagine_con_nuovo_path, len_file ))
		printf("Errore: impossibile salvare il file ruotato %s\n", nome_immagine_con_nuovo_path);
	else
		printf("Immagine ruotata %s ricevuta correttamente!\n", nome_immagine_con_nuovo_path);

	close(service_provider.s); 

}

